//################################################################################
// MIT License
// Copyright (c) 2024 ZhangYihua
//
// Change Logs:
// Date           Author       Notes
// 2020-07-20     ZhangYihua   first version
//
// Description  : Single Error Correction only, not support Double Error Detection
//################################################################################

module sec_only_enc #(
parameter           DW                      = 32,       // original data width, 1<=DW<=502

// the following parameters are calculated automatically
parameter           CW                      = ecc_cw_f(DW, "SEC_ONLY")  // the smallest redundant check width but meet DW <= 2^CW - CW - 1
) ( 
input                                       frc_sbe,    // force single-bit error
input               [DW-1:0]                od,         // original data
output              [DW+CW-1:0]             cd          // coded data
);

//################################################################################
// define local varialbe and localparam
//################################################################################
wire                [DW*CW-1:0]             ep_ary_nc;  // error pattern for each single error
wire                [DW*CW-1:0]             gm_ary;     // generative matrix
reg                 [CW-1:0]                c;
wire                [CW+DW-1:0]             e;

//################################################################################
// main
//################################################################################

sec_only_gep #(.DW(DW)) u_gep (.ep_ary(ep_ary_nc), .gm_ary(gm_ary));

always@(*) begin:CHK
    integer i;

    for (i=0; i<CW; i=i+1) begin
        c[i] = ^(od & gm_ary[i*DW+:DW]);
    end
end

assign e = (frc_sbe==1'b1) ? {{DW+CW-1{1'b0}}, 1'b1} :
                             {DW+CW{1'b0}};
assign cd = {c, od} ^ e;

`include "func_ecc.v"   // refer to ecc_cw_f()

//################################################################################
// ASSERTION
//################################################################################

`ifdef CBB_ASSERT_ON
// synopsys translate_off


// synopsys translate_on
`endif

endmodule
